#ifndef __PINTYPE_H
#define __PINTYPE_H

#include "stdint.h"
#include "app_cfg.h"

/*******************************************************************************
* @brief   DIR
*******************************************************************************/
#define PIN_MODE_IN_UP 0x01
#define PIN_MODE_IN_DN 0x02
#define PIN_MODE_IN_FLOAT 0x03
#define PIN_MODE_IN_AIN 0x04

// 低速，中速，高速
#define PIN_MODE_OUT_SL_PP 0x11
#define PIN_MODE_OUT_SL_OD 0x12
#define PIN_MODE_OUT_SM_PP 0x13
#define PIN_MODE_OUT_SM_OD 0x14
#define PIN_MODE_OUT_SH_PP 0x15
#define PIN_MODE_OUT_SH_OD 0x16

#define PIN_MODE_OUT_PP PIN_MODE_OUT_SH_PP
#define PIN_MODE_OUT_OD PIN_MODE_OUT_SH_OD

/*******************************************************************************
* @brief   通用
*******************************************************************************/
typedef struct
{
	void (*en)(void);
	void (*dis)(void);
	void (*out)(uint8_t st);
	void (*tog)(void);
	uint8_t (*out_st)(void);
	uint8_t (*in_st)(void);
	void (*mode)(char pm); //模式
} port_fun_pin_type;

/*******************************************************************************
* @brief   通用
*******************************************************************************/
typedef struct
{
	void (*en)(void);
	void (*dis)(void);
	void (*out)(uint8_t st);
	void (*tog)(void);
	uint8_t (*out_st)(void);
	uint8_t (*in_st)(void);
	void (*dir_in_ft)(void);  //浮空输入
	void (*dir_in_up)(void);  //上拉输入
	void (*dir_out_pp)(void); //推挽输出
	void (*dir_out_od)(void); //开漏输出
} port_io_pin_type;

/*******************************************************************************
 * @brief   输出
 *******************************************************************************/
typedef struct
{
	void (*en)(void);
	void (*dis)(void);
	void (*out)(uint8_t st);
	void (*tog)(void);
	uint8_t (*out_st)(void);
} port_out_pin_type;

/*******************************************************************************
 * @brief   输入
 *******************************************************************************/
typedef struct
{
	uint8_t (*in_st)(void);
} port_in_pin_type;

/*******************************************************************************
 * @brief   输出, 支持多端口同步操作
 *******************************************************************************/
struct port_multi_out_pin_str
{
	void (*en)(void);
	void (*dis)(void);
	void (*out)(uint8_t st);
	uint8_t (*out_st)(void);
	const struct port_multi_out_pin_str **next;
};

typedef struct port_multi_out_pin_str port_multi_out_pin_type;

/*******************************************************************************
 * @brief   应用层 输出 定义
 *******************************************************************************/
#if APP_IO_MULTI_LINK > 0
#define app_io_out_pin_type port_multi_out_pin_type
#else
#define app_io_out_pin_type port_out_pin_type
#endif

#endif
